[Spring] - NoSuchMethod

๐Ÿ› ๏ธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ

  • kotlin : 2.1.0
  • Spring Boot : 3.3.0

๐Ÿ’ฌ ์ƒํ™ฉ ์„ค๋ช…

ํšŒ์‚ฌ ํ”„๋กœ์ ํŠธ์—์„œ ์„œ๋น„์Šค ๋กœ์ง์„ ๊ฐœ๋ฐœํ•˜๋˜ ์ค‘, ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๋‹ˆ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

java.lang.NoSuchMethodError: 'java.lang.Object server.temperature.TemperatureService.findTemperature(int, kotlin.coroutines.Continuation)'
@Service
class TemperatureService(
	...
) {
	suspend fun findTemperature(
		temperatureCatRowid: Int
	): Flow<Temperature> = ...
}

์—๋Ÿฌ ๋ฉ”์‹œ์ง€์— ๋ณด์ด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด NoSuchMehtod์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์ง€๋งŒ, ๋ถ„๋ช… ์„œ๋น„์Šค์—๋Š” ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

โœ… ํ•ด๊ฒฐ ๊ณผ์ •

ํšŒ์‚ฌ ํ”„๋กœ์ ํŠธ๋Š” ์• ๊ทธ๋ฆฌ๊ฒŒ์ดํŠธ(Aggregate) ๋‹จ์œ„๋กœ ๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. ํŒŒ์ผ ๊ฒ€์ƒ‰์„ ํ†ตํ•ด ํ™•์ธํ•ด๋ณด๋‹ˆ ๋‹ค๋ฅธ ์• ๊ทธ๋ฆฌ๊ฒŒ์ดํŠธ ๋ชจ๋“ˆ์—์„œ ๋™์ผํ•œ ์ด๋ฆ„์˜ ์„œ๋น„์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์™œ ์Šคํ”„๋ง์€ ๋™์ผํ•œ ์ด๋ฆ„์˜ ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ์—๋Ÿฌ๋ฅผ ์žก์ง€ ์•Š์•„์ฃผ์—ˆ์„๊นŒ?

์šฐ์„ , JVM์€ ํŒจํ‚ค์ง€์™€ ํด๋ž˜์Šค ์ด๋ฆ„(์ •ํ™•ํžˆ๋Š” FQCN: Fully Qualified Class Name)์„ ๊ธฐ์ค€์œผ๋กœ ํด๋ž˜์Šค๋ฅผ ๊ตฌ๋ถ„ํ•œ๋‹ค. ๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ฐ ๋ชจ๋“ˆ์ด ์„œ๋กœ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๋ฏ€๋กœ, ๋™์ผํ•œ ์ด๋ฆ„์˜ ํด๋ž˜์Šค๊ฐ€ ์žˆ์–ด๋„ JVM์€ ์ด๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ์ธ์‹ํ•œ๋‹ค.

Spring์€ ํด๋ž˜์Šค ์ด๋ฆ„(์†Œ๋ฌธ์ž๋กœ ์‹œ์ž‘)์„ ๊ธฐ๋ณธ์ ์ธ Bean ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ๋™์ผํ•œ ์ด๋ฆ„์˜ Bean์ด ๋“ฑ๋ก๋  ๊ฒฝ์šฐ, ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฎ์–ด์”Œ์›Œ์ง„๋‹ค.

๋Ÿฐํƒ€์ž„์— ๋ฐœ์ƒํ•œ java.lang.NoSuchMethodError๋Š” JVM์ด ์ž˜๋ชป๋œ ํด๋ž˜์Šค๋ฅผ ์ฐธ์กฐํ•˜๋ฉด์„œ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ๋‹ค. ๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ ํ™˜๊ฒฝ์—์„œ๋Š” ๋™์ผํ•œ ์ด๋ฆ„์˜ ํด๋ž˜์Šค๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง„ Bean์ด ์ถฉ๋Œํ•˜๋ฉด์„œ ํด๋ž˜์Šค ๋กœ๋”ฉ ๊ณผ์ •์—์„œ ์˜๋„์น˜ ์•Š์€ ๋™์ž‘์ด ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค.

๊ฒฐ๋ก ์ ์œผ๋กœ, ๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ ํ™˜๊ฒฝ์—์„œ Spring์€ ๋จผ์ € ์Šค์บ”๋œ Bean์„ ๋ฎ์–ด์”Œ์šฐ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ, ์ด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค์ •๊ณผ ์„ค๊ณ„ ๋ฐฉ์‹์— ๋”ฐ๋ผ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋ฌธ์ œ๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿค” ํšŒ๊ณ 

์ •๋ง ๊ฐ„๋‹จํ•œ ๋ฌธ์ œ์˜€์ง€๋งŒ, ์‹ค์ œ๋กœ ์ € ์ƒํ™ฉ์—์„œ ๊ทผ๋ณธ์ ์ธ ์›์ธ์„ ์ฐพ๊ธฐ๋ณด๋‹จ, ๋นŒ๋“œ ์บ์‹œ๊ฐ€ ์Œ“์—ฌ์„œ ๋ฐœ์ƒํ•œ ์—๋Ÿฌ๋กœ ํŒ๋‹จํ•˜๊ณ , clean build, invalidation cache๋ฅผ ๋จผ์ € ์‹œ๋„ํ–ˆ๋‹ค.

ํ•ด๋‹น ๋ฌธ์ œ๊ฐ€ ์•„๋‹Œ๊ฒŒ ์•Œ์•˜์œผ๋ฉด, ๋จผ์ € ๊ฐ™์€ ํด๋ž˜์Šค๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ–ˆ์–ด์•ผ ํ–ˆ๋Š”๋ฐ, ์Šคํ”„๋ง์€ ๊ตฌ๋™์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋จธ๋ฆฌ ์†์— ๊ทธ๋Ÿฐ ์ƒ๊ฐ์ด ๋“ค์ง€ ์•Š์•˜๋‹ค.

์ด ์—๋Ÿฌ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉด์„œ ์Šคํ”„๋ง๊ณผ JVM์— ๋Œ€ํ•ด ์ž˜ ๋ชจ๋ฅด๋Š”๊ฒŒ ๋งŽ์€ ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ๋Š๊ปด์กŒ๋‹ค. ์กฐ๊ธˆ ๋” ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ๋จผ์ € ์ƒ๊ฐํ•˜๋Š” ์Šต๊ด€์„ ๊ฐ€์ ธ์•ผํ•  ๊ฒƒ ๊ฐ™๋‹ค.

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ